<?php

/**
 * Validador de telefones
 */
class ZFKiller_Validate_Dddtelefone extends Zend_Validate_Digits
{

    /**
     * Se =0, nao faz nenhuma validacao em relacao a DDD
     * Se =1, valida com Zend_Validate_Digits e tamanho em 2
     *
     * @var int
     */
    private $validateDdd = 1;

    /**
     * Se =0, nao faz nenhuma validacao com o numero de telefone
     * Se =1, valida com Zend_Validate_Digits e tamanho deve estar entre 8 e 9
     * Se =2, valida com Zend_Validate_NotEmpty
     * Se =3, valida com Zend_Validate_Digits
     *
     * @var int
     */
    private $validateNumber = 1;

    const INVALID_EMPTY = 'invalidEmpty';
    const INVALID_DDD_LENGTH = 'invalidDddLength';
    const INVALID_TEL_LENGTH = 'invalidTelLength';

    public function __construct(array $options = array())
    {
        $this->_messageTemplates[self::INVALID] = "DDD e Telefone devem ser somente números";
        $this->_messageTemplates[self::INVALID_EMPTY] = "DDD e Telefone não podem ser vazios";
        $this->_messageTemplates[self::INVALID_DDD_LENGTH] = "DDD deve possuir apenas 2 números";
        $this->_messageTemplates[self::INVALID_TEL_LENGTH] = "Telefone deve possuir 8 ou 9 números";

        if (isset($options['validadeDdd'])) {
            $this->setValidateDdd($options['validadeDdd']);
        }
        if (isset($options['validadeNumber'])) {
            $this->setValidateNumber($options['validadeNumber']);
        }
    }

    public function isValid($value)
    {
        if (!$this->isValidDdd($value['ddd'])) {
            return false;
        }
        if (!$this->isValidFone($value['number'])) {
            return false;
        }
        return true;
    }

    private function isValidDdd($ddd)
    {
        switch ($this->validateDdd) {
            case 1:
                if (strlen($ddd) != 2) {
                    $this->_error(self::INVALID_DDD_LENGTH);
                    return false;
                }
                return parent::isValid($ddd);
                break;
        }
        return true;
    }

    private function isValidFone($number)
    {
        switch ($this->validateNumber) {
            case 1:
                if (!parent::isValid($number)) {
                    return false;
                }
                if ((strlen($number) < 8) || (strlen($number) > 9)) {
                    $this->_error(self::INVALID_TEL_LENGTH);
                    return false;
                }
                break;

            case 2:
                if ($number == '') {
                    $this->_error(self::INVALID_EMPTY);
                    return false;
                }
                break;

            case 3:
                return parent::isValid($number);
                break;
        }

        return true;
    }

    private function setValidateDdd($validateDdd)
    {
        $validateDdd = (int) $validateDdd;
        if (($validateDdd >= 0) && ($validateDdd <= 1)) {
            $this->validateDdd = $validateDdd;
        }
    }

    private function setValidateNumber($validateNumber)
    {
        $validateNumber = (int) $validateNumber;
        if (($validateNumber >= 0) && ($validateNumber <= 3)) {
            $this->validateNumber = $validateNumber;
        }
    }

}
